今天,我們真的要開始我們的Spring boot開發了!
在後端的架構中,跟資料庫串接一直是非常重要的項目,通常我們跟資料庫溝通的方式都是按照SQL的語法呼叫,也就是說我們需要額外學習SQL,並且配合SQL的資料庫系統與標題來寫數據,當資料庫的欄位增加,我們也要手動去調整指令,這樣當指令成千上百個,我們就要修改成千上百次。
所以在系統開發中,我們都希望專一在一個程式語言上,並且在系統的欄位有所變化時資料庫能自動跟著改變,這就是JPA的功用,讓我們能夠使用Java語法,只要簡單的引入Interface,就能夠修改,使用我們需要的資料。接下來,我們就要更詳細的說明什麼是JPA
我們從之前的MySQL、Eclipse介紹就可以知道,資料庫與Java的開發環境是獨立出來的,若要取得資料庫的內容,我們就必須要開發所有的指令去操作這些資料庫,那有沒有辦法有一個標準統一指令,讓Java跟資料庫之間的有一個一致的溝通方法呢?因為有了這個想法,JPA就出現了。
JPA是一個Java標準規範,提供了對象關聯映射(ORM)的技術,可以將Java對象映射到數據庫中的表格,並進行數據的持久化操作。JPA本身是一個規範,不是一個具體的實現。
實體(Entity):對應數據庫中的一個表。
實體管理器(EntityManager):負責實體的CRUD操作。
持久化上下文(Persistence Context):實體對象與數據庫中的行之間的關聯。
這些看起來很抽象,但是JPA的核心觀念就是Class跟SQL table可以相互對應,並且讓Java可以根據這個Class進行操作,這個Class就是所謂的Entity。
Spring Data JPA 是 Spring 根據 ORM 框架和 JPA 規範而封裝的 JPA 應用框架,目的是降低存取資料層的工作量,讓開發人員只需寫出 repository 的介面,而 Spring 自動幫你實作其功能。
Spring Boot JPA是一個基於Spring Data JPA的框架,進一步簡化了JPA的使用,並與Spring生態系統緊密集成。它通過自動配置和簡單的編程模型,使開發者能夠更加方便地使用JPA來訪問數據庫。
Spring Boot JPA的特點包括:
自動配置:Spring Boot自動配置了JPA相關的依賴和設置,開發者不需要手動配置數據源和EntityManager等。
Repository接口:Spring Data JPA提供了一套Repository接口,使得開發者可以通過簡單的接口方法來進行數據操作,如save、findAll、findById等,並且支持自動生成查詢語句。
查詢方法生成:Spring Data JPA支持通過命名約定自動生成查詢方法,例如,根據方法名findByUsername,自動生成相應的SQL查詢語句。
簡單的事務管理:通過@Transactional註解來管理事務,確保數據操作的一致性。
與其他Spring模塊的集成:可以輕鬆地與其他Spring模塊(如Spring Security、Spring MVC等)集成,構建完整的應用程序。
Spring Boot JPA使得數據庫訪問變得更加輕量級,適合構建現代化的微服務應用程序。開發者可以專注於業務邏輯,而不需要過多關注底層的數據庫訪問細節。
接下來,我們就要建置自己的JPA,來設定呼叫SQL的參數。SQL本身需要兩件事情,第一個是要資料資料庫中有多少的標題,第二件事情就是要知道要對這個資料庫做什麼,我們首先要做的第一件事情就是用Java設置Entity來告訴SQL需要多少個標題。
要設置Entity,首先要去accounting的資料夾,創建一個資料夾名為entity,然後再新增一個Class稱為Account
Java的語法裡面,有分成Class跟Interface兩個類,我們一開始要創建的是class這一類,要創建這個類,我們可以對entity按右鍵,然後選擇New->other
在點選Other後,要點選class
接下來會進入這個畫面,輸入我們要的名稱Account,即可創建這個類別
接著打開這個類別,然後輸入以下的程式碼
package net.Eric.accounting.entity;
import java.time.LocalDateTime;
import java.util.Date;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name ="accounts")
public class Account {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "name")
private String name;
@Column(name = "expensed")
private Boolean expensed ;
@Column(name = "category")
private String category ;
@Column(name = "amount")
private Long amount ;
@Column(name = "createdate")
private LocalDateTime createDate;
public Account() {
}
public Account(Long id,String name, Boolean expensed, String category, long amount,LocalDateTime createDate) {
this.id = id;
this.name = name;
this.expensed = expensed;
this.category = category;
this.amount = amount;
this.createDate = createDate;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public boolean getExpensed() {
return expensed;
}
public void setExpensed(Boolean expensed) {
this.expensed = expensed;
}
public String getCategory() {
return category;
}
public void setCategory(String category) {
this.category = category;
}
public Long getAmount() {
return amount;
}
public void setAmount(Long amount) {
this.amount = amount;
}
public LocalDateTime getCreateDate() {
return createDate;
}
public void setCreateDate(LocalDateTime createDate) {
this.createDate = createDate;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
在這裡面中,主要有以下的區域,我用圖片切割給大家,一一作說明
這裡可以分成四個區域,第一個區域是環境參數,就是引用之後Class都可以使用的資料
第二個區塊主要是告訴系統這個Class可以做什麼,像是我們使用了@Table(name = "accounts"),也就是我們要建置一個資料表,而這個資料表叫做accounts
第三個區塊就是這個資料表裡面有哪些欄位
第四個是屬於Java的操作,就是當我們呼叫這個Class的時候,我們能對這些參數做什麼操作,當我們沒有做這個動作的時候,我們就沒有辦法執行輸入與修改的操作。
當我們完成這個頁面後,我們就完成了Entity的設置,Java就會知道我們要在SQL中建立名為accounts的資料表,接下來我們要告訴Java我們能夠對資料庫做什麼樣子的操作。
在理解這些觀念後,我們就要來在系統中建置我們的JPA,首先要先在accounting資料夾中建立repository的資料夾,並且新增一個interface名叫AccountRepository
創建的方法就是在Repository的資料夾中點右鍵,然後選擇Other
選擇之後選擇下方的Interface
設置好後,我們只要在這裡輸入extends JpaRepositry<Account , Long>即完成了我們對Repository的設置。
package net.Eric.accounting.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import net.Eric.accounting.entity.Account;
public interface AccountRepository extends JpaRepository<Account, Long>{
}
當我們在輸入的時候,可能會發現JpaReository底下有紅色的字,這個時候,只要把滑鼠移到下面,然後就會出現選項讓我們選
這個時候只要選擇Import'JpaReository'那一行即可匯入
在這裏<>裡面代表的是我們要操作的Entity,以及Id的類別。
當我們建置完成之後,我們可以像先前教的,再次啟動專案。
在這個時候我們可能會遇到很多的問題,這個時候就是真正鍛鍊一個工程師的地方。我們可能會遇到Component沒有創立好、getter setter設置錯誤等等問題,這些就是身為一個工程是需要磨練的地方。
當我們解決的Bug越多,我們就越像是一個工程師。
然後不用擔心,把這裡出現的問題都丟給ChatGPT,讓ChatGPT來好好的處理即可。
當我們成功出現執行的畫面之後,去到我們的SQL中,就會發現Java Spring boot自動幫我們創建了資料表。
到這邊,我們就完成了JPA的實作了!